在前一篇文章中,我們簡要介紹了 Gin 框架,以及如何使用。今天我們將建立一個 RESTful API。
RESTful API 是一種基於 REST 架構風格設計的應用程式介面,用於在不同的軟體系統之間進行通信。REST(Representational State Transfer)是一種軟體設計風格,強調資源的狀態以及通過 URL、HTTP 方法(GET、POST、PUT、DELETE 等)和狀態碼來對這些資源執行操作。
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Todo struct {
ID string `json:"id"`
Title string `json:"title"`
}
var todos []Todo
func main() {
r := gin.Default()
r.GET("/todos", GetTodos)
r.GET("/todos/:id", GetTodo)
r.POST("/todos", CreateTodo)
r.PUT("/todos/:id", UpdateTodo)
r.DELETE("/todos/:id", DeleteTodo)
r.Run(":8080")
}
func GetTodos(c *gin.Context) {
c.JSON(http.StatusOK, todos)
}
func GetTodo(c *gin.Context) {
id := c.Param("id")
for _, todo := range todos {
if todo.ID == id {
c.JSON(http.StatusOK, todo)
return
}
}
c.JSON(http.StatusNotFound, gin.H{"message": "Todo not found"})
}
func CreateTodo(c *gin.Context) {
var todo Todo
if err := c.BindJSON(&todo); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"})
return
}
todo.ID = GenerateID()
todos = append(todos, todo)
c.JSON(http.StatusCreated, todo)
}
func UpdateTodo(c *gin.Context) {
id := c.Param("id")
var updatedTodo Todo
if err := c.BindJSON(&updatedTodo); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"})
return
}
for i, todo := range todos {
if todo.ID == id {
todos[i] = updatedTodo
c.JSON(http.StatusOK, updatedTodo)
return
}
}
c.JSON(http.StatusNotFound, gin.H{"message": "Todo not found"})
}
func DeleteTodo(c *gin.Context) {
id := c.Param("id")
for i, todo := range todos {
if todo.ID == id {
todos = append(todos[:i], todos[i+1:]...)
c.JSON(http.StatusNoContent, nil)
return
}
}
c.JSON(http.StatusNotFound, gin.H{"message": "Todo not found"})
}
func GenerateID() string {
// 這裡可以使用一個簡單的方式生成唯一 ID,例如使用時間戳記
return "todo" + time.Now().Format("20060102150405")
}
[GET] localhost:8080/todos/
[POST] localhost:8080/todos
[GET] localhost:8080/todos/
[PUT] localhost:8080/todos/todo20230929163805
[GET] localhost:8080/todos
[DELETE] localhost:8080/todos/123
[GET] localhost:8080/todos/123
今天實作簡單的 RESTful API